home *** CD-ROM | disk | FTP | other *** search
/ Amiga Game-Power / Amiga Game-Power.iso / pd mix ii / access / hddriver / support / fixdisk.c < prev    next >
C/C++ Source or Header  |  1994-05-20  |  6KB  |  196 lines

  1.  
  2. #include <stdio.h>
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include "harddisk.h"
  6. #include <ctype.h>
  7.  
  8.  
  9.  
  10. struct MsgPort *            diskport;
  11. struct IOExtHD *            diskreq;
  12. BYTE                        sector[ HD_SECTOR ];
  13. struct hd_FirstSector        first;
  14.  
  15.  
  16. extern struct MsgPort *        CreatePort ();
  17. extern struct IORequest *    CreateExtIO ();
  18. extern LONG                    OpenDevice ();
  19. extern LONG                    DoIO ();
  20.  
  21.  
  22. main()
  23. {
  24.     long error;
  25.     
  26.     diskport = CreatePort ( 0L , 0L );
  27.     if ( diskport == NULL ) {
  28.         printf ( "Error in CreatePort ()\n" );
  29.     }
  30.     else {
  31.         diskreq = (struct IOExtHD *)
  32.             CreateExtIO ( diskport , (LONG) sizeof ( struct IOExtHD ) );     
  33.         if ( diskreq == NULL ) {
  34.             printf ( "CreateExtIO() failed\n" );
  35.         }
  36.         else {
  37.             error = OpenDevice ( HD_NAME , 0L , diskreq , 0L );
  38.             if ( error != 0 ) {
  39.                 printf ( "Error value returned by OpenDevice was %ld\n" , error );
  40.             }
  41.             else {
  42.                 diskreq->iohd_TD.iotd_Req.io_Command = CMD_READ;
  43.                 diskreq->iohd_TD.iotd_Req.io_Data = (APTR) &first;
  44.                 diskreq->iohd_TD.iotd_Req.io_Length = sizeof ( first );
  45.                 diskreq->iohd_TD.iotd_Req.io_Offset = 0;
  46.                 if ( DoIO ( diskreq ) != 0 ) {
  47.                     printf ( "Error in reading first sector information\n" );
  48.                 }
  49.                 else {
  50.                     if ( first.magic != HD_MAGIC )
  51.                         printf ( "Header sector information not found (wrong magic number)\n" );
  52.                     else
  53.                         do_commands ();
  54.                 }
  55.                 CloseDevice ( diskreq );
  56.             }
  57.             DeleteExtIO ( diskreq , (LONG) sizeof ( struct IOExtHD ) );
  58.         }
  59.         DeletePort ( diskport );
  60.     }
  61. }
  62.  
  63.  
  64. do_commands ()
  65. {
  66.     long block;
  67.     int i;
  68.     char buf[ 80 ];
  69.     int retry_limit;
  70.  
  71.     while ( 1 ) {
  72.  
  73.         printf ( "\nDisk Information:\n\n" );
  74.         printf ( "%4ld cylinders\n" , first.cylinders );
  75.         printf ( "%4ld park cylinder\n" , first.park_cylinder );
  76.         printf ( "%4ld heads\n" , first.heads );
  77.         printf ( "%4ld sectors\n" , first.sectors );
  78.         printf ( "%4ld map sectors\n" , first.map_sectors );
  79.         printf ( "%4ld bad sectors\n" , first.bad_sectors );
  80.         printf ( "%4ld write precompensation\n" , first.precomp );
  81.         printf ( "\nBad blocks: " );
  82.         for ( i = 0; i < first.bad_sectors; i++ )
  83.             printf ( "%ld " , (long)first.map[i] );
  84.         printf ( "\n\n" );
  85.  
  86.         diskreq->iohd_TD.iotd_Req.io_Command = CMD_FLUSH;
  87.         DoIO ( diskreq );
  88.         diskreq->iohd_TD.iotd_Req.io_Command = CMD_CLEAR;
  89.         DoIO ( diskreq );
  90.  
  91.         printf ( "Enter block number or (q)uit: " );
  92.         if ( gets ( buf ) == NULL )
  93.             return;
  94.         if ( buf[0] == 'q'  ||  buf[0] == 'Q' )
  95.             return;
  96.         if ( sscanf ( buf , "%ld" , &block ) != 1 ) {
  97.             printf ( "Illegal block number\n" );
  98.         }
  99.         else {
  100.             printf ( "Reading block %ld\n" , block );
  101.             diskreq->iohd_TD.iotd_Req.io_Command = CMD_READ;
  102.             diskreq->iohd_TD.iotd_Req.io_Data = (APTR) §or[0];
  103.             diskreq->iohd_TD.iotd_Req.io_Length = HD_SECTOR;
  104.             diskreq->iohd_TD.iotd_Req.io_Offset = block * HD_SECTOR;
  105.             if ( DoIO ( diskreq ) != 0 ) {
  106.                 while ( 1 ) {
  107.                     printf ( "Failed to read sector - enter retry count: " );
  108.                     if ( gets ( buf ) == NULL )
  109.                         return;
  110.                     if ( sscanf ( buf , "%d" , &retry_limit ) != 1 )
  111.                         retry_limit = 1;
  112.                     if ( retry_limit <= 0 )
  113.                         break;
  114.                     for ( i = 0; i < retry_limit; i++ ) {
  115.                         printf ( "Reading block %ld\n" , block );
  116.                         diskreq->iohd_TD.iotd_Req.io_Command = CMD_READ;
  117.                         diskreq->iohd_TD.iotd_Req.io_Data = (APTR) §or[0];
  118.                         diskreq->iohd_TD.iotd_Req.io_Length = HD_SECTOR;
  119.                         diskreq->iohd_TD.iotd_Req.io_Offset = block * HD_SECTOR;
  120.                         if ( DoIO ( diskreq ) == 0 )
  121.                             break;
  122.                     }
  123.                     if ( i >= retry_limit ) {
  124.                         printf ( "Failed to read sector after %d attempts - setting buffer to 0's\n" ,
  125.                             retry_limit );
  126.                         for ( i = 0; i < HD_SECTOR; i++ )
  127.                             sector[i] = 0;
  128.                     }
  129.                     else {
  130.                         printf ( "Sector successfully read after %d retries\n" , i );
  131.                         break;
  132.                     }
  133.                 }
  134.             }
  135.             printf ( "(u)nlink the sector or\n(w)rite the sector? " );
  136.  
  137.             if ( gets ( buf ) == NULL )
  138.                 return;
  139.  
  140.             if ( buf[0] == 'u'  ||  buf[0] == 'U' ) {
  141.  
  142.                 while ( first.bad_sectors < HD_MAP_SIZE
  143.                 &&  first.map[ first.bad_sectors ] == MAP_MARK_BAD )
  144.                     first.bad_sectors++;
  145.  
  146.                 if ( first.bad_sectors >= HD_MAP_SIZE ) {
  147.                     printf ( "Bad sector map table is full!\n" );
  148.                 }
  149.                 else {
  150.                     /* write out sector at block first.bad_sectors */
  151.                     printf ( "Writing sector buffer to block %ld\n" ,
  152.                         first.bad_sectors + HD_MAP_SECTORS );
  153.                     diskreq->iohd_TD.iotd_Req.io_Command = CMD_WRITE;
  154.                     diskreq->iohd_TD.iotd_Req.io_Data = (APTR) §or[0];
  155.                     diskreq->iohd_TD.iotd_Req.io_Length = HD_SECTOR;
  156.                     diskreq->iohd_TD.iotd_Req.io_Offset =
  157.                         ( first.bad_sectors + HD_MAP_SECTORS ) * HD_SECTOR;
  158.                     if ( DoIO ( diskreq ) != 0 ) {
  159.                         printf ( "Failed to write block - bad sector not removed\n" );
  160.                     }
  161.                     else {
  162.                         /* change map */
  163.                         first.map[ first.bad_sectors++ ] = block;
  164.  
  165.                         /* write out sector map */
  166.                         diskreq->iohd_TD.iotd_Req.io_Command = CMD_WRITE;
  167.                         diskreq->iohd_TD.iotd_Req.io_Data = (APTR) &first;
  168.                         diskreq->iohd_TD.iotd_Req.io_Length = sizeof ( first );
  169.                         diskreq->iohd_TD.iotd_Req.io_Offset = 0;
  170.                         if ( DoIO ( diskreq ) != 0 ) {
  171.                             printf ( "Failed to write first sectors\n" );
  172.                             return;
  173.                         }
  174.                         printf ( "\nUnlinked - WARNING: you must reboot for driver to learn of relinking\n\n" );
  175.                     }
  176.                 }
  177.             }
  178.             else if ( buf[0] == 'w'  ||  buf[0] == 'W' ) {
  179.                 printf ( "Writing block %ld\n" , block );
  180.                 diskreq->iohd_TD.iotd_Req.io_Command = CMD_WRITE;
  181.                 diskreq->iohd_TD.iotd_Req.io_Data = (APTR) §or;
  182.                 diskreq->iohd_TD.iotd_Req.io_Length = HD_SECTOR;
  183.                 diskreq->iohd_TD.iotd_Req.io_Offset = block * HD_SECTOR;
  184.                 if ( DoIO ( diskreq ) != 0 ) {
  185.                     printf ( "Failed to rewrite sector\n" );
  186.                 }
  187.                 else
  188.                     printf ( "Rewrite successful\n" );
  189.             }
  190.             else {
  191.                 printf ( "Sector not unlinked or rewritten\n" );
  192.             }
  193.         }
  194.     }
  195. }
  196.